//+------------------------------------------------------------------+
//|                                                  AccountInfo.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.h>

//+------------------------------------------------------------------+
//| 账户信息类                                                       |
//| 用途：访问账户信息的类                                           |
//|         继承自 CObject 类                                        |
//+------------------------------------------------------------------+
class CAccountInfo : public CObject
{
public:
   /** 构造函数 */
   CAccountInfo(void);
   
   /** 析构函数 */
   ~CAccountInfo(void);
   
   /**
    * 获取账户登录ID
    * @return 账户登录ID
    */
   long              Login(void) const;
   
   /**
    * 获取账户交易模式
    * @return 账户交易模式枚举值
    */
   ENUM_ACCOUNT_TRADE_MODE TradeMode(void) const;
   
   /**
    * 获取账户交易模式描述
    * @return 交易模式描述字符串
    */
   string            TradeModeDescription(void) const;
   
   /**
    * 获取账户杠杆
    * @return 杠杆值
    */
   long              Leverage(void) const;
   
   /**
    * 获取账户止损水平模式
    * @return 止损水平模式枚举值
    */
   ENUM_ACCOUNT_STOPOUT_MODE StopoutMode(void) const;
   
   /**
    * 获取账户止损水平模式描述
    * @return 止损水平模式描述字符串
    */
   string            StopoutModeDescription(void) const;
   
   /**
    * 获取账户保证金计算模式
    * @return 保证金计算模式枚举值
    */
   ENUM_ACCOUNT_MARGIN_MODE MarginMode(void) const;
   
   /**
    * 获取账户保证金计算模式描述
    * @return 保证金计算模式描述字符串
    */
   string            MarginModeDescription(void) const;
   
   /**
    * 检查是否允许交易
    * @return 允许交易返回 true，否则返回 false
    */
   bool              TradeAllowed(void) const;
   
   /**
    * 检查是否允许EA交易
    * @return 允许EA交易返回 true，否则返回 false
    */
   bool              TradeExpert(void) const;
   
   /**
    * 获取挂单限制数量
    * @return 挂单限制数量
    */
   int               LimitOrders(void) const;
   
   /**
    * 获取账户余额
    * @return 账户余额
    */
   double            Balance(void) const;
   
   /**
    * 获取账户信用额度
    * @return 账户信用额度
    */
   double            Credit(void) const;
   
   /**
    * 获取账户当前利润
    * @return 账户当前利润
    */
   double            Profit(void) const;
   
   /**
    * 获取账户净值
    * @return 账户净值
    */
   double            Equity(void) const;
   
   /**
    * 获取已用保证金
    * @return 已用保证金
    */
   double            Margin(void) const;
   
   /**
    * 获取可用保证金
    * @return 可用保证金
    */
   double            FreeMargin(void) const;
   
   /**
    * 获取保证金水平
    * @return 保证金水平百分比
    */
   double            MarginLevel(void) const;
   
   /**
    * 获取保证金追加水平
    * @return 保证金追加水平值
    */
   double            MarginCall(void) const;
   
   /**
    * 获取强制平仓水平
    * @return 强制平仓水平值
    */
   double            MarginStopOut(void) const;
   
   /**
    * 获取账户名称
    * @return 账户名称
    */
   string            Name(void) const;
   
   /**
    * 获取服务器名称
    * @return 服务器名称
    */
   string            Server(void) const;
   
   /**
    * 获取账户货币
    * @return 账户货币
    */
   string            Currency(void) const;
   
   /**
    * 获取经纪商公司名称
    * @return 经纪商公司名称
    */
   string            Company(void) const;
   
   /**
    * 获取整数型账户信息
    * @param prop_id 属性ID
    * @return 属性值
    */
   long              InfoInteger(const ENUM_ACCOUNT_INFO_INTEGER prop_id) const;
   
   /**
    * 获取浮点型账户信息
    * @param prop_id 属性ID
    * @return 属性值
    */
   double            InfoDouble(const ENUM_ACCOUNT_INFO_DOUBLE prop_id) const;
   
   /**
    * 获取字符串型账户信息
    * @param prop_id 属性ID
    * @return 属性值
    */
   string            InfoString(const ENUM_ACCOUNT_INFO_STRING prop_id) const;
   
   /**
    * 计算订单利润
    * @param symbol 交易品种
    * @param trade_operation 交易操作类型
    * @param volume 交易量
    * @param price_open 开仓价格
    * @param price_close 平仓价格
    * @return 订单利润
    */
   double            OrderProfitCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation,
                                      const double volume, const double price_open, const double price_close) const;
   
   /**
    * 计算订单保证金
    * @param symbol 交易品种
    * @param trade_operation 交易操作类型
    * @param volume 交易量
    * @param price 价格
    * @return 订单保证金
    */
   double            MarginCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation,
                                 const double volume, const double price) const;
   
   /**
    * 计算订单可用保证金
    * @param symbol 交易品种
    * @param trade_operation 交易操作类型
    * @param volume 交易量
    * @param price 价格
    * @return 订单可用保证金
    */
   double            FreeMarginCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation,
                                     const double volume, const double price) const;
   
   /**
    * 计算最大可交易手数
    * @param symbol 交易品种
    * @param trade_operation 交易操作类型
    * @param price 价格
    * @param percent 保证金使用百分比
    * @return 最大可交易手数
    */
   double            MaxLotCheck(const string symbol, const ENUM_ORDER_TYPE trade_operation,
                                 const double price, const double percent = 100) const;
};
//+------------------------------------------------------------------+